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

nzo*_*dlo 1 c arrays string fgets char

我正在使用的数组是:

char arr[91][12];
Run Code Online (Sandbox Code Playgroud)

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

for(i = 0; fgets(arr[i], 12, inFile); i++){}
Run Code Online (Sandbox Code Playgroud)

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

测试该数组:

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.'
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用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]);
}
Run Code Online (Sandbox Code Playgroud)

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

Som*_*ude 5

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

arr[i][strlen(arr[i]) - 1] = '\0';
Run Code Online (Sandbox Code Playgroud)

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


为了确保你真的有一个新行,你可以strpbrk像你一样使用(但当然不像你在其他答案中解释的那样).但我认为使用它会更好strrchr.首先是因为它更简单(只搜索字符而非字符串),第二,因为它从头开始搜索:

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

或者最快捷的方式:

size_t length = strlen(arr[i]);
if (arr[i][length - 1] == '\n')
    arr[i][length - 1] = '\0';
Run Code Online (Sandbox Code Playgroud)

  • +1.如果它返回读取的字符数而不是"NULL"或你给它的缓冲区,我认为`fgets`会更好. (2认同)