-6

我是c语言的初学者。请帮我找出代码的错误,因为它会在显示屏上显示编译错误。

#include <stdio.h>
#include <string.h>
void main()
{
    char i;
    char arr[23];

    printf("Enter your name? \n");`
    scanf("%c",&arr[i]);

    for(int v=0;v<=strlen(arr);v++)
    {
        printf("%c",arr[v]);
    }
}
4

4 回答 4

2

您的代码有几个问题,而不仅仅是一个:

1.

您使用错误的格式说明符%c来捕获单个字符而不是%s捕获字符串:

char arr[23];
printf("Enter your name: \n");`
scanf("%c",&arr[i]);

宁可使用scanf("%s",arr);甚至更好的scanf("%Ns",arr);whereN代表要输入的最大字符数。请注意,以字符串结尾的空字符需要一个元素,因此它需要至少比char组成数组的字符少一个。

您还可以使用fgets(arr,23,stdin)which 首选从标准输入中使用字符串,因为它更安全,因为它要求您提供要读取的最大字符数(也计算空字符),并且还可以读取空格分隔的单词作为默认为字符串。


2.

i未初始化为任何值,因此:

scanf("%c",&arr[i]);

导致未定义的行为。


3.

此外,您尝试通过使用strlen()作为 for 循环的条件表达式的一部分来获取字符串长度:

for(int v = 0; v <= strlen(arr); v++)

尽管没有有效的字符串arr会导致未定义的行为。

作为旁注:strlen()在 for 循环之前只使用一次会更有效,将其返回值存储在适当类型的对象中(size_t是 的返回值的类型strlen())并在 for 的条件下使用该对象循环而不是strlen()在每次迭代之前执行。


4.

接下来是您尝试在 for 循环中打印未提供/初始化为的字符arr

for(int v = 0; v <= strlen(arr); v++)
{
   printf("%c",arr[v]);
}

5.

带有条件的 for 循环v <= strlen()

for(int v = 0; v <= strlen(arr); v++)

比预期多运行一次,并打印出多余的空字符,因为空字符不可打印。

而是使用v < strlen()或根据第 3 点:

    size_t len = strlen(arr);

    for(int v = 0; v < len; v++)

6.

的返回值main应该是int,不是void


7.

调用后有一个尾随撇号printf()

printf("Enter your name: \n");`

而是使用:

#include <stdio.h>

int main()
{
    char arr[23];

    printf("Enter your name: \n");

    scanf("%22s",arr);

    printf("%s",arr);
}

在线示例

如果您想一次打印出整个输入的字符串,或者:

#include <stdio.h>
#include <string.h>

int main()
{
    char arr[23];

    printf("Enter your name: \n");

    scanf("%22s",arr);

    size_t len = strlen(arr);

    for(int v = 0; v < len; v++)
    {
        printf("%c",arr[v]);
    }        
}

在线示例

如果要单独打印每个字符。

于 2020-04-03T08:18:58.467 回答
0

您的错误并不是真正的错误。你在这条车道上有一个额外的角色:

 printf("Enter your name? \n");`

它应该是:

 printf("Enter your name? \n");
于 2020-04-03T08:18:36.567 回答
0

行尾有一个`

printf("Enter your name? \n");`
于 2020-04-03T08:18:50.390 回答
0

请注意,您在int i这里使用的是未初始化的,scanf("%c",&arr[i]);这是错误的。

你也scanf("%c",&arr[i]);只能扫描一个字符的字符串arr,我认为这不是你的目的。

您可以scanf("%s",arr[i]);改为使用适当地扫描字符串。

另请注意,当您逐个字符地扫描字符串时,您必须在字符串\0的末尾添加终止符。在扫描字符之后,直到i-1数组元素添加\0i这样的元素arr[i]=\0;

因为你的字符串没有适当地终止strlen,所以效果不好。

另请注意,您应该打印字符串元素,而v<strlen(arr)最后一个字符应该是\0,因此您应该使用for(int v=0;v<=strlen(arr);v++)

还要注意用int mainvoid main

看:

void main()
{
    char arr[23];

    printf("Enter your name? \n");
    scanf("%s",arr);

    for(int v=0;v<strlen(arr);v++)
    {
        printf("%c",arr[v]);
    }//or instead of loop use printf("%s",arr);
}
于 2020-04-03T08:47:24.300 回答