2

我正在从文件中读取一个字符串,然后尝试在字符串中添加零直到它达到 100,然后我正在打印字符串,但我不知道出了什么问题,我尝试了不止一种方法,但它们似乎都不起作用。

int main(int argc, char *argv[])
{
    if (argc != 2 ){
        fprintf(stderr, "usage: server filename \n");
        exit(1);
    }
    FILE *file = fopen(argv[1], "r");
    if (file==0)
    {
        printf("file couldn't be opened\n");
        exit(1);
    } 
    int i;
    char str1[100];
    //char str2[100];
    //memset(str2,0,sizeof(str2));
     //for(i = 0; i < 100; i++)
         // fprintf(stdout, "str2[%u]: %u\n",i,str2[i]);

    while (fscanf(file, "%s", str1) != EOF) 
    {
        for(i=13 ; i < 100; i++)
            str1[i]=0;


    }

         for(i = 0; i < 100; i++)
         fprintf(stdout, "str1[%u]: %u\n",i,str1[i]);

    return 0;
}

但我打印出来了

str1[0]: 119
str1[1]: 111
str1[2]: 114
str1[3]: 108
str1[4]: 100
str1[5]: 0
str1[6]: 0
str1[7]: 0
up till 99

尽管文件“hello”中有一个字符串,但我不明白这一点,然后我试过了

int main(int argc, char *argv[])
{
    if (argc != 2 ){
        fprintf(stderr, "usage: server filename \n");
        exit(1);
    }
    FILE *file = fopen(argv[1], "r");
    if (file==0)
    {
        printf("file couldn't be opened\n");
        exit(1);
    } 
    int i;
    char str1[12];
    char str2[100];
    memset(str2,0,sizeof(str2));
     //for(i = 0; i < 100; i++)
         // fprintf(stdout, "str2[%u]: %u\n",i,str2[i]);

    while (fscanf(file, "%s", str1) != EOF) 
    {

     strcpy(str2,str1);

    }

         for(i = 0; i < 100; i++)
         fprintf(stdout, "str2[%u]: %u\n",i,str2[i]);

    return 0;
}

我给了我与第一个完全相同的结果,所以我不明白这里发生了什么,以及为什么我会得到这些结果。如果您能解释我在这里做错了什么,我将不胜感激。提前致谢。

4

5 回答 5

2

在最后一个代码片段中,您不应该这样做:

memset(str2,0,sizeof(str2));

但反而:

memset(str2,0,sizeof(char) * 100);

检查 sizeof 上的链接:http ://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays#sizeof

于 2012-09-27T14:15:42.793 回答
1

这里有很多错误的东西。

对我来说最明显的一个是您将每个字符打印为%u,即unsigned int. 您应该将每个字符打印为char,即%c

其次,正如fableal所指出的,你memset()也是错的。使用sizeof(str2)表示 的大小str2,它是一个指针,在 32 位架构中,它将是 32 位。这显然不是你想要的。

于 2012-09-27T14:16:55.447 回答
1

您看不到字符的原因是 printf 正在打印整数。将其更改为%c

fprintf(stdout, "str2[%u]: %c\n",i,str2[i]);
于 2012-09-27T14:17:40.793 回答
0

如果我理解正确,您的目标是拥有一个字符数组,其中包含文件中的单行,除此之外还有 0。例如:

文件:

hello

数组结果:

[h][e][l][l][o][0][0][0]...

因此,最简单的方法是先将数组初始化为 0,然后读出该行:

char str1[100] = {'0'};
fgets(str1, 100, file); 

要打印它们,您可以像字符串一样打印它:

printf("%s\n", str1); 

但请记住,您将整个内容设置为 0(空终止符),因此您只会看到“hello”。如果您像以前一样使用小数打印:

for(i=0; i<100; i++)
  printf("%d ", str1[i]);

你会在 ASCII 中看到 hello,后跟 0

104 101 108 108 111 10 0 0 0 0 0 0 0 0 0...
于 2012-09-27T14:26:22.397 回答
0

这个:

memset(str2,0,sizeof(str2));

不需要,因为这样:

while (fscanf(file, "%s", str1) != EOF) 
{
 strcpy(str2,str1);
}

覆盖str2每次str1迭代。这意味着前一个字符串被丢弃。您的意思可能是strcat(),在这种情况下,您应该在循环之前使用 str2[0] = '\0';`。

于 2012-09-27T14:17:43.320 回答