在一行中将字符串设为null

时间:2010-08-14 07:17:29

标签: c for-loop

为了使字符串成为空字符串,我写了这个:

#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
    char str[15]="fahad uddin";
    strlen(str);
    puts(str);
    for(int i=0;str[i]!='\0';i++)
        strcpy(&str[i],"\0") ;
    puts(str);
    getch();
    return 0;
}

在此之前我尝试过:

#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
    char str[15]="fahad uddin";
    strlen(str);
    puts(str);
    for(int i=0;str[i]!='\0';i++,strcpy(&str[i],"\0"))
        ;
    puts(str);
    getch();
    return 0;
}

在第一个示例中,程序运行正常,而在第二个示例中,它打印字符串的第一个字母(在此示例中为F)。这是为什么?

5 个答案:

答案 0 :(得分:10)

C字符串以空值终止。只要您只使用假定以空字符结尾的字符串的函数,就可以将第一个字符归零。

str[0] = '\0';

答案 1 :(得分:8)

memset(str,0,strlen(str)); /* should also work */
memset(str,0,sizeof str); /* initialize the entire content */

答案 2 :(得分:5)

for(int i=0;str[i]!='\0';i++,strcpy(&str[i],"\0")); - i ++在strcpy执行之前递增i - 所以它将在第一次迭代时获取str [1]的地址 - 跳过str [0] - 因此你将获得第一个角色。

请注意,KennyTM的反应是一种更好的方法 - 但我想你正在学习/尝试。

答案 3 :(得分:3)

因为i++,strcpy(&str[i],"\0")在评估对i++的调用之前评估strcpy()i使用现在递增的'\0'值作为目标。实际上,它会跳过字符串的第一个字符。

请注意,有更好的方法可以做你想做的事。

KennyTM提到只使用str[0] = '\0';将第一个字符设置为memset(),它不会清除每个字节,但会将字符串标记为长度为零。

还有strcpy()用于填充任意值的内存块,当然允许0。

此外,调用str[]的效率远远低于仅仅分配给循环中{{1}}的每个元素。

答案 4 :(得分:-2)

尝试使用此代码:

bzero(string_name, size_of_string);

另外,包括<string.h> lib文件。我认为这一定有效。