In my C program, I have a string that I want to process one line at a time, ideally by saving each line into another string, doing what I want with said string, and then repeating. I have no idea how this would be accomplished, though.
I was thinking of using sscanf. Is there a "read pointer" present in sscanf like there would be if I was reading from a file? What would be another alternative for doing this?
Read String from the user You can use the scanf() function to read a string. The scanf() function reads the sequence of characters until it encounters whitespace (space, newline, tab, etc.).
Now, to take input in C we do it by using the following methods: scanf(“%c”,&str[i]); – Using a loop. scanf(“%s”,str); – Using %s format specifier. gets(str); – Gets gives us an extra ability to use space in an character string/array.
C provides two basic ways to read and write strings. input/output functions, scanf/fscanf and printf/fprintf. Second, we can use a special set of string-only functions, get string (gets/fgets) and put string ( puts/fputs ).
Here's an example of how you can do it efficiently, if you are allowed to write into the long string:
#include <stdio.h>
#include <string.h>
int main(int argc, char ** argv)
{
char longString[] = "This is a long string.\nIt has multiple lines of text in it.\nWe want to examine each of these lines separately.\nSo we will do that.";
char * curLine = longString;
while(curLine)
{
char * nextLine = strchr(curLine, '\n');
if (nextLine) *nextLine = '\0'; // temporarily terminate the current line
printf("curLine=[%s]\n", curLine);
if (nextLine) *nextLine = '\n'; // then restore newline-char, just to be tidy
curLine = nextLine ? (nextLine+1) : NULL;
}
return 0;
}
If you're not allowed to write into the long string, then you'll need to make a temporary string for each line instead, in order to have the per-line string NUL terminated. Something like this:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char ** argv)
{
const char longString[] = "This is a long string.\nIt has multiple lines of text in it.\nWe want to examine each of these lines separately.\nSo we will do that.";
const char * curLine = longString;
while(curLine)
{
const char * nextLine = strchr(curLine, '\n');
int curLineLen = nextLine ? (nextLine-curLine) : strlen(curLine);
char * tempStr = (char *) malloc(curLineLen+1);
if (tempStr)
{
memcpy(tempStr, curLine, curLineLen);
tempStr[curLineLen] = '\0'; // NUL-terminate!
printf("tempStr=[%s]\n", tempStr);
free(tempStr);
}
else printf("malloc() failed!?\n");
curLine = nextLine ? (nextLine+1) : NULL;
}
return 0;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With