在用fgets()填充后,如何从我的字符串数组中删除换行符“\ n”?

时间:2013-02-20 02:10:13

标签: c arrays string char fgets

我正在使用的数组是:

char arr[91][12];

所以我使用for循环从文件填充我的数组:

for(i = 0; fgets(arr[i], 12, inFile); i++){}

当我想从该数组中打印任何内容时,它会自动转义到下一行。

测试该数组:

for(i = 0; fgets(arr[i], 12, inFile); i++){
    printf("%s", arr[i]);
}

//one
//two
//three etc.

//want it to be 'one two three etc.'

我正在尝试使用strpbrk()为数组中的每个字符串查找\n,并将其更改为\0,如下所示:

for(i = 0; fgets(arr[i], 12, inFile); i++){
if(strpbrk(arr[i], "\n") != NULL ){
    arr[i][strpbrk(arr[i], "\n")] = '\0';
    }
printf("%s", arr[i]);
}

但这给了我错误。有没有更好的方法来做我想做的事情?

3 个答案:

答案 0 :(得分:5)

它实际上比您想象的要简单得多。如果换行符结束(就像用fgets读取时那样),只需将最后一个字符更改为字符串终止符:

arr[i][strlen(arr[i]) - 1] = '\0';

-1是因为数组(如字符串可以被认为是)在零开始索引并转到length - 1


为确保您确实拥有换行符,您可以使用例如strpbrk就像你一样(但当然不像你在其他答案中解释的那样)。但我认为使用strrchr会更好。首先是因为它更简单(只搜索字符而非字符串),其次是因为它从头开始搜索:

char *newlineptr = strrchr(arr[i], '\n');
if (newlineptr != NULL)
    *newlineptr = '\0';

或者最快的方式:

size_t length = strlen(arr[i]);
if (arr[i][length - 1] == '\n')
    arr[i][length - 1] = '\0';

答案 1 :(得分:4)

strpbrk()返回指向换行符的指针,因此您只需使用一次:

char *nl;

if ((nl = strpbrk(arr[i], "\n")) != NULL)
    *nl = '\0';

或者,换行符将是字符串中的最后一个字符,因此也适用:

size_t len = strlen(arr[i]);
if (arr[i][len-1] == '\n')
   arr[i][--len] = '\0';

请注意,这会检查您是否有换行符; fgets()除了NUL '\0'以外的任何内容空间不足时停止阅读,即使它还没有读取换行符。 这也为您提供了字符串的长度(strpbrk()也是间接的;它是nl - arr[i] - 1)。请注意,strpbrk()及其相对strcspn()strlen()更复杂。

答案 2 :(得分:3)

strpbrk指针返回给'\n'。所以改变:

arr[i][strpbrk(arr[i], "\n")] = '\0';

为:

*strpbrk(arr[i], "\n") = '\0';