2013-04-04 184 views
0

我打算修改特定字符串的每个其他字母。但为了这个程序的目的,没有发生这种情况。到目前为止,我已从用户处抓取一个字符串并将其存储在userinput中,并打算将其打印出来。使用scanf()函数

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

int main(void) {  
char userinput[256] =""; 
printf("Enter somthing to change:\n"); 
scanf("%s", &userinput); 
printf("%s\n", userinput); 

int k = 2; // This is just here to do something every time k is even 
int j = strlen(userinput); 
for (int i = 0; i < j; i++) { 

    if(k % 2 == 0) { 
     printf("%s", userinput[i]); 
     k++; 
    } 
    else { 
     printf("%s", userinput[i]); 
     k++; 
    } 
} 

} 

strlen()但是功能上不userinput工作。我想这是因为strlen()应该采用字符串的第一个字符的地址,然后迭代,直到达到一个空字符,但scanf实际上并没有创建一个空字符。 我想不出在字符串后面加入'\0'而不知道字符串长度的方法。

如果存储在数组中,我将如何访问存储的字符序列的长度?

+1

“'strlen()'函数在'userinput'上不起作用”以什么方式? 'strlen(userinput)'是 - 除非输入超出数组 - 一个有效的调用。 – 2013-04-04 14:07:41

回答

6

此:

scanf("%s", &userinput); 

应该是:

scanf("%s", userinput); 

运营商&的地址是不需要的,和不正确的。当传递给函数时,数组衰减到其第一个元素的地址。 scanf("%s")将附加一个空终止字符,所以不需要显式插入一个。

要防止潜在的缓冲区溢出,请指定scanf()应写入userinput的最大字符数。这应该是比userinput大小少一个,留有余地终止空字符:

scanf("%255s", userinput); 

不正确的格式说明(这是未定义的行为)正被用于打印的userinputchar acters:使用%c%s。这:

printf("%s", userinput[i]); 

必须是:

printf("%c", userinput[i]); 
1

更改此

scanf("%s", &userinput); 

scanf("%s", userinput); 

我们必须使用地址scanf

  • 如果我们将扫描到一个int a那么我们要调用scanf()a =>&a
  • 地址。如果我们将扫描成double a那么我们要调用scanf()a =>&a地址
  • 但是如果我们将扫描数据与指针(存储器地址)int *a;或字符数组char a[50];然后我们必须调用scanf()用指针或与阵列而不添加&

scanf()

根据格式字符串,函数可能期望的 附加参数的序列,每个都包含一个指针,其中所提取的字符的解释中存储有分配的存储 适当的类型。这些参数中至少应该包含与格式说明符存储的值数量一样多的参数。 该函数将忽略其他参数。这些自变量为 预期为指针:要将scanf操作的结果存储在 常规变量中,其名称应以参考 运算符(&)(请参阅示例)开头。

+0

这很有道理。我想我对'char userinput [256]'的初始声明有点困惑。如果我是正确的,它是指向数组的第一个字符的指针,但它不需要被声明为这样。这就是为什么当我去存储它时,我认为我需要给出地址 – Deepak 2013-04-04 18:59:55

1

变化

scanf("%s", &userinput); 

scanf("%s", userinput); 

没有在字符串捕获的情况下所需的&操作。 scanf()自动将空字符('\0')附加到字符串的末尾,因此int j = strlen(userinput);应该工作。

如果仍要计算长度没有此功能的有效这里是链接How to calculate the length of a string in C efficiently?

1

你感到困惑类型,正如其他人指出。当你对类型感到困惑时使用scanf和printf是很危险的!

scanf(“%s”,& userinput);

类型的&userinputchar (*)[256],但预计的scanf %s以对应于char *。由于期望的类型和给出的类型不同,并且不需要具有相同的表示,所以行为是未定义的。

我想,这是因为strlen的是应该采取一个字符串的 第一个字符的地址,然后重复,直到到达一个空字符,但 scanf函数实际上并没有创建一个空字符。

错误。当您使用%s格式说明符时,scanf肯定会分配一个空字符。也就是说,提供scanf不会遇到错误或EOF。关于这一点,你应该检查是否有错误从scanf函数:

if (scanf("%s", userinput) != 1) { 
    /* Insert error handling here */ 
} 

...因为你应该在C.

k所有标准库函数是没有意义的。您的循环已经以k的频率递增i

strlen返回一个size_t。确保您将返回值存储在正确的类型中。如果函数返回size_t,则将返回值存储在size_t中。如果函数返回int,则将返回值存储在int中。得到它了?无论返回类型是什么,都是用于存储返回类型的类型。使用手册找出。

printf("%s", userinput[i]);

有一次那种混乱。 userinput[i]char%s告诉printf预计char *。当参数无效时,行为是未定义的。这可能会导致程序出现故障。考虑printf("%c", userinput[i]);printf("%s", &userinput[i]);